encyklopedia.space

Specyfikacja WebAssembly

WebAssembly (skrócone jako Wasm) jest otwartym standardem określającym binarny format instrukcji oraz wirtualną maszynę, umożliwiającą uruchamianie kodu w przeglądarkach internetowych oraz w środowiskach niezależnych od przeglądarki. Specyfikacja definiuje zarówno format pliku, jak i semantykę wykonywania, zapewniając wysoką wydajność i bezpieczeństwo.

Historia

Prace nad WebAssembly rozpoczęły się w 2015 roku w inicjatywie Mozilla, Google i Microsoft. Pierwsza publiczna wersja specyfikacji, oznaczona jako MVP (Minimum Viable Product), została ogłoszona w 2017 roku. W 2019 roku organizacja W3C przyjęła specyfikację jako rekomendację, a kolejna wersja została zatwierdzona w 2020 roku.

Struktura specyfikacji

Specyfikacja WebAssembly jest podzielona na kilka kluczowych części:

  • Format binarny – opisuje sposĂłb kodowania modułów w postaci plikĂłw .wasm.
  • Format tekstowy – przyjazna dla czĹ‚owieka reprezentacja (WAT – WebAssembly Text).
  • Model typĂłw – definiuje typy prymitywne (i32, i64, f32, f64) oraz typy funkcji.
  • Instrukcje – zbiĂłr operacji niskopoziomowych, podzielonych na kategorie (kontrola przepĹ‚ywu, arytmetyka, pamięć, itp.).
  • Model pamiÄ™ci – liniowy bufor pamiÄ™ci, dostÄ™pny poprzez instrukcje load i store.
  • Model bezpieczeĹ„stwa – sandbox, izolacja pamiÄ™ci oraz walidacja podczas Ĺ‚adowania moduĹ‚u.

Moduły

Podstawową jednostką kodu w WebAssembly jest moduł. Moduł składa się z sekcji, z których najważniejsze to:

Typy i instrukcje

WebAssembly obsługuje cztery podstawowe typy danych:

i32 – liczba całkowita 32‑bitowa
i64 – liczba całkowita 64‑bitowa
f32 – liczba zmiennoprzecinkowa 32‑bitowa (IEEE‑754)
f64 – liczba zmiennoprzecinkowa 64‑bitowa (IEEE‑754)
    

Instrukcje sÄ… podzielone na kilka grup, np.:

  • Kontrola przepĹ‚ywu – if, else, br, br_if, loop, call.
  • Arytmetyka i logika – i32.add, i64.sub, f32.mul, i32.and.
  • Operacje pamiÄ™ci – i32.load, i64.store, memory.grow.
  • Operacje na zmiennych globalnych – global.get, global.set.

Model pamięci i bezpieczeństwo

Pamięć WebAssembly jest reprezentowana jako jednowymiarowy bufor (tzw. linear memory), który może rosnąć w granicach określonych w sekcji pamięci. Dostęp do pamięci jest kontrolowany – każdy dostęp jest sprawdzany pod kątem przekroczenia granic, co zapobiega błędom typu buffer overflow.

Bezpieczeństwo jest zapewniane poprzez sandbox – kod Wasm działa w izolowanym środowisku, nie ma bezpośredniego dostępu do systemu operacyjnego ani zasobów przeglądarki, a jedynie to, co zostało jawnie udostępnione przez importy.

Narzędzia i ekosystem

Do kompilacji kodu źródłowego do WebAssembly wykorzystywane są m.in.:

  • LLVM – potężny backend, obsĹ‚ugujÄ…cy jÄ™zyki C++, Rust, C i inne.
  • Emscripten – zestaw narzÄ™dzi do kompilacji C/C++ do Wasm.
  • AssemblyScript – jÄ™zyk podobny do TypeScript, kompilujÄ…cy bezpoĹ›rednio do Wasm.

W przeglądarkach współczesnych (np. Chrome, Firefox, Safari, Edge) WebAssembly jest obsługiwane natywnie i umożliwia uruchamianie kodu z prędkością zbliżoną do natywnej.

Zastosowania

WebAssembly znalazło zastosowanie w wielu dziedzinach:

  • Gry i aplikacje 3‑D – silniki takie jak Unity i Unreal Engine eksportujÄ… gry do Wasm.
  • ObrĂłbka multimediĂłw – kodeki audio i wideo, edytory grafiki.
  • Wirtualizacja i Ĺ›rodowiska uruchomieniowe – Docker i WebContainers.
  • Komputacja naukowa – symulacje, algorytmy numeryczne.
  • Rozszerzenia przeglÄ…darek i dodatki bezpieczeĹ„stwa.

Rozwój i przyszłość

Specyfikacja jest stale rozwijana przez grupÄ™ WebAssembly Community Group. W najnowszych wersjach wprowadzono m.in.:

  • Rozszerzenia SIMD – wsparcie dla instrukcji wektorowych.
  • WielowÄ…tkowość – Threads i SharedArrayBuffer.
  • Interfejsy WASI (WebAssembly System Interface) – umoĹĽliwiajÄ…ce dostÄ™p do zasobĂłw systemowych poza przeglÄ…darkÄ….
  • Rozszerzenia GC – planowane wprowadzenie automatycznego zarzÄ…dzania pamiÄ™ciÄ….

Bibliografia i źródła

Głównym źródłem wiedzy jest oficjalna specyfikacja WebAssembly publikowana przez W3C oraz organizację WebAssembly Community Group. Szczegółowe informacje można znaleźć w dokumentacji projektów LLVM, Emscripten oraz w artykułach akademickich opisujących wydajność i bezpieczeństwo tego standardu.